defmodule EliPhxPlay.ChatSchema.Messages do
  use Ecto.Schema
  import Ecto.Changeset

  # 设置主键
  @primary_key {:message_id, :binary_id, autogenerate: true}

  # 设置外键类型
  @foreign_key_type :binary_id

  # 定义schema
  schema "messages" do

    # 定义sender字段，关联Users表
    belongs_to :sender, EliPhxPlay.ChatSchema.Users,
      foreign_key: :sender_id,
      references: :user_id,
      type: :binary_id

    # 定义chat_id字段
      field :chat_id, :binary_id

    # 定义chat_type字段
      field :chat_type, :string

    # 定义message_type字段，默认值为"text"
      field :message_type, :string,default: "text"

    # 定义content字段
      field :content, :string

    # 定义extra_data字段，默认值为空map
      field :extra_data, :map,default: %{}

    # 添加时间戳
    timestamps()
  end

  # 定义changeset函数，用于验证和修改数据
  def changeset(message, attrs) do
    message
    # 使用cast函数将attrs中的数据映射到message中
    |> cast(attrs, [:sender_id, :chat_id, :chat_type, :message_type, :content, :extra_data])
    # 验证sender_id、chat_id、chat_type、content字段是否为空
    |> validate_required([:sender_id, :chat_id, :chat_type, :content])
    # 验证chat_type字段是否为"private"或"group"
    |> validate_inclusion(:chat_type, ["private", "group"])
    # 验证message_type字段是否为"text"、"image"、"file"或"voice"
    |> validate_inclusion(:message_type, ["text", "image", "file", "voice"])
    # 验证content字段长度是否大于等于1
    |> validate_length(:content, min: 1)
    # 验证sender字段是否存在
    |> assoc_constraint(:sender)
  end

end
